// #include <stdio.h>
#include <intrins.h>
// #include <string.h>
#include "nrf24l01.h"

uchar name = 'A'; //模块标记
uchar flag = 0;   //是否发送数据标志
//adc0832
sbit CS = P3 ^ 5;  // chip select
sbit CLK = P3 ^ 6; // clock
sbit DIO = P3 ^ 7; // data input and output
//数码管位选
sbit qian = P2 ^ 4;
sbit bai = P2 ^ 5;
sbit shi = P2 ^ 6;
sbit ge = P2 ^ 7;
// 数码管数值
uchar code ledData[] = {
    0x3F, //"0"
    0x06, //"1"
    0x5B, //"2"
    0x4F, //"3"
    0x66, //"4"
    0x6D, //"5"
    0x7D, //"6"
    0x07, //"7"
    0x7F, //"8"
    0x6F, //"9"
    0x77, //"A"
    0x7C, //"B"
    0x39, //"C"
    0x5E, //"D"
    0x79, //"E"
    0x71, //"F"
    0x76, //"H"
    0x38, //"L"
    0x37, //"n"
    0x3E, //"u"
    0x73, //"P"
    0x5C, //"o"
    0x40, //"-"
    0x00  //清空
};

/*
* 延时2微秒
* 
* @return
*/
void delay2us()
{
    _nop_();
    _nop_();
}

/*
* AD转换
*
* @return 输出数据
*/
uchar get_AD_Res()
{
    uchar i, data1 = 0, data2 = 0;
    CS = 0;
    //第一个周期：转换开始
    CLK = 0;
    DIO = 1;
    delay2us();
    CLK = 1;
    delay2us();
    //第二个周期：选择单通道还是双通道 DIO=0双通道差分 或 DIO=1单通道
    CLK = 0;
    DIO = 1;
    delay2us();
    CLK = 1;
    delay2us();
    //第三个周期：DIO选择CH1-->如果DIO=0 选择CH0
    CLK = 0;
    DIO = 0;
    delay2us();
    CLK = 1;
    delay2us();
    //等待
    CLK = 0;
    DIO = 1;
    delay2us();
    //先进来的为最高位，后进来为最低位
    for (i = 0; i < 8; i++)
    {
        CLK = 1;
        delay2us();
        CLK = 0;
        delay2us();
        /*
		* 0000_0000|0000_000想=0000_000想
		* 0000_00想0|0000_000翔=0000_00想翔
		* 0000_0想翔0|0000_000子=0000_0想翔子
		*/
        data1 = (data1 << 1) | (uchar)DIO;
    }
    //先进来的为最低位，后进来为最高位
    for (i = 0; i < 8; i++)
    {
        /*
		* 0000_0000|0000_000子=0000_000子
		* 0000_000子|0000_00翔0=0000_00翔子
		* 0000_00翔子|0000_0想00=0000_0想翔子
		*/
        data2 = data2 | (uchar)DIO << i;
        CLK = 1;
        delay2us();
        CLK = 0;
        delay2us();
    }
    //禁止片选
    CS = 1;
    return (data1 == data2) ? data1 : 0;
}

/***********************************************
函数：uartInit()
描述：
    串口初始化 printf用
************************************************/
void uartInit() //初始化函数
{
    SCON = 0x40;            //串口通信工作方式1
    REN = 1;                //允许接收
    TMOD = 0x20;            //定时器1的工作方式2
    TH1 = 0xfd, TL1 = 0xfd; //波特率9600
    TI = 1;                 //这里一定要注意
    // TR1 = 1; //打开定时器
}
//------------------------------
//         定时器0初始化
//------------------------------
void ET0_init()
{
    TMOD &= 0xf0; //定时器0
    TMOD |= 0x01;
    TH0 = (65536 - 2000) / 256; //2ms溢出
    TL0 = (65536 - 2000) % 256;
    ET0 = 1;
    TR0 = 1;
}

//---------------------------------
//         定时器1初始化
//-----------------------------------
void ET1_init()
{
    TMOD &= 0x0f;
    TMOD |= 0x10;
    TH1 = (65536 - 2000) / 256; //2ms溢出
    TL1 = (65536 - 2000) % 256;
    ET1 = 1;
    TR1 = 1; //打开定时器1
}
void main()
{
    // uint j;
    // for (j = 0; j < TX_PLOAD_WIDTH - 1; j++)
    //     TX_BUF[j] = '\n';
    Nrf24l01_Init();
    ET0_init();
    ET1_init();
    EA = 1;  //打开总中断
    CLK = 0; //ADC0832初始化
    CS = 1;
    while (1)
    {
        if (flag)
        {
            TX_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据
            Check_ACK(1);    // 等待发送完毕，清除TX FIFO
            DelayMS(250);
            DelayMS(250);
            flag = 0;
        }
    }
}
//---------------------------------
//            定时器0中断
//---------------------------------
void ET0_INT() interrupt 1
{
    static uchar w;

    TH0 = (65536 - 2000) / 256; // 重装初值
    TL0 = (65536 - 2000) % 256;
    P2 |= 0xf0; //消影
    switch (w)  //位选，选择点亮的数码管，
    {
    case (0):
        P0 = ledData[name - 0x37];
        qian = 0;
        break; //显示千位
    case (1):
        P0 = ledData[TX_BUF[1]] | 0x80;
        bai = 0;
        break; //显示百位
    case (2):
        P0 = ledData[TX_BUF[2]];
        shi = 0;
        break; //显示十位
    case (3):
        P0 = ledData[TX_BUF[3]];
        ge = 0;
        break; //显示个位
    }
    w++;
    if (w == 4)
    {
        w = 0;
    }
}

//---------------------------------------------
//        定时器T1中断服务程序
//---------------------------------------------
void ET1_INT() interrupt 3
{
    uchar AD;
    uint d;
    TH1 = (65536 - 2000) / 256; // 重装初值
    TL1 = (65536 - 2000) % 256;
    if (flag == 0)
    {
        // AD = get_AD_Res();
        // d = AD * 500.0 / 256.0; //d需uint 多40
        d = 322;
        TX_BUF[3] = d % 10;
        TX_BUF[2] = d / 10 % 10;
        TX_BUF[1] = d / 100 % 10;
        TX_BUF[0] = name;
        TX_BUF[4] = '\n';
        flag = 1;
    }
}
